package com.yonyou.crm.common.dao.itf;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.yonyou.crm.common.page.entity.Page;

public interface IBaseDao {

	/**
	 * 保存实体
	 * @param vo
	 * @return 是否成功
	 */
	public <T extends Serializable> T save(T vo); 
	
	/**
	 * 按照id删除
	 * @param vo 待删除vo
	 * @return
	 */
	public <T extends Serializable> int delete(T vo);
	
	/**
	 * 按照id批量删除
	 * @param clazz 要删除的类型
	 * @param ids id数组
	 * @return
	 */
	public <T extends Serializable> int batchDelete(Class<T> clazz, Object ids);
	
	/**
	 * 执行delete sql
	 * @param clazz 要删除的类型
	 * @param funcName mapper文件中的id
	 * @param param 条件
	 * @return
	 */
	public <T extends Serializable> int delete(Class<T> clazz , String funcName, Map<String, Object> param);
	
	/**
	 * 修改实体
	 * @param vo
	 * @return
	 */
	public <T extends Serializable> T update(T vo); 
	
	/** 
     * 分页查询 
     * @param clazz 
     * @param p 
     * @return 
     */  
    public <T extends Serializable> Page<T> pageSelect(Class<T> clazz,Page<?> p,String[]attrs,Object[]values);
    
    /**
     * 分页查询(自定义)
     * @param clazz
     * @param p
     * @param selectFuncName
     * @param countFuncName
     * @param paraMap
     * @return
     */
    public <T extends Serializable> Page<T> pageSelect(Class<T> clazz,
			Page<?> p, String selectFuncName, String countFuncName, Map<String, Object> paraMap) ;
    
    /**
     * 分页查询时，用来统计总条数
     * @param clazz
     * @param attrs
     * @param values
     * @return
     */
    public <T extends Serializable> int pageCount(Class<T> clazz, String[]attrs, Object[] values); 
    
	/**
	 * 通过主键获取实体
	 * @param clazz
	 * @param id
	 * @return
	 */
	public <T extends Serializable> T getById(Class<T> clazz, Serializable id); 
	
	/**
	 * 统计总条数
	 * @param clazz
	 * @return
	 */
	public <T extends Serializable> int countAll(Class<T> clazz);
	
	/**
	 * 按照条件统计记录数
	 * @param clazz
	 * @param funcName 方法名称
	 * @param paraMap
	 * @return
	 */
	public <T extends Serializable> int countAll(Class<T> clazz, String funcName, Object param);
	
    /**
	 * 查询一条记录,带条件
	 * @param clazz 类
     * @param funcName  mapper文件中select标签中的id
     * @param param 参数
	 * @return
	 */
    public <T extends Serializable> Object selectOne(Class<T> clazz, String funcName, Object param);
    /**
     * 查询一条记录,不带条件
     * @param statement
     * @return
     */
	public <T extends Serializable> Object selectOne(Class<T> clazz, String funcName);
    
    /**
     * 指定查询使用的sql，查询结果封装成List
     * @param clazz 类
     * @param funcName  mapper文件中select标签中的id
     * @param param 参数
     * @return
     */
    public <T extends Serializable> List<Map<String, Object>> selectList(Class<T> clazz, String funcName, Object param);
    
    /**
     * 指定查询使用的sql，查询结果封装成List
     * @param clazz 类
     * @param funcName  mapper文件中select标签中的id
     * @return
     */
    public <T extends Serializable> List<Map<String, Object>> selectList(Class<T> clazz, String funcName);
    
    /**
     * 查询多条记录，返回字符串集合
     * @param clazz
     * @param funcName
     * @return
     */
    public <T extends Serializable> List<String> selectStrList(Class<T> clazz, String funcName, Object param);
    
    /**
     * 查询多条记录，返回vo集合
     * @param clazz
     * @param funcName
     * @param param
     * @return
     */
    public <T extends Serializable> List<T> selectVoList(Class<?> clazz, String funcName, Object param);

    
    /**
	 * 执行update sql
	 * @param clazz 要更新的类型
	 * @param funcName mapper文件中的id
	 * @param para 条件
	 */
	public <T extends Serializable> int updateSql(Class<T> clazz, String funcName, Object param);
	/**
	 * 执行update sql
	 * @param clazz 要更新的类型
	 * @param funcName mapper文件中的id
	 */
	public  <T extends Serializable> int updateSql(Class<T> clazz, String funcName);
	
	/**
	 * 执行delete sql
	 * @param clazz 要删除的类型
	 * @param funcName mapper文件中的id
	 * @param para 条件
	 * @return
	 */
	public <T extends Serializable> int deleteSql(Class<T> clazz , String funcName, Object param);
	/**
	 * 执行delete sql
	 * @param clazz 要删除的类型
	 * @param funcName mapper文件中的id
	 * @return
	 */
	public <T extends Serializable> int deleteSql(Class<T> clazz, String funcName);
	
    /**
	 * 执行insert sql
	 * @param clazz 要保存的类型
	 * @param funcName mapper文件中的id
	 * @param para 条件
	 */
	public <T extends Serializable> int saveSql(Class<T> clazz, String funcName, Object param);
    
    
}
